package com.sparrow.common.util;

import org.apache.commons.lang3.StringUtils;

import java.util.regex.Pattern;

/**
 * NameUtil 类提供了用于验证名称的工具方法。
 * 可以验证名称的长度、是否包含特殊字符、emoji 表情等。
 */
public class NameUtil {

    // 限制使用的特殊字符数组
    private static final String[] LIMIT_CHAR = { "%", ",", "*", "^", "#", "$", "&", ":", "_", "[", "]", "|", ">", "<", "=", "+", "(", ")", "{", "}", "//", "\\", "`", "~", "-", ".", "," };

    // 匹配 emoji 表情的正则（覆盖 U+1F000 ~ U+1FFFF 范围）
    private static final Pattern EMOJI_PATTERN = Pattern.compile("[\\p{So}\\p{Cn}]|[\\uD83C-\\uDBFF][\\uDC00-\\uDFFF]");

    // 匹配特殊字符串的正则表达式
    private static final Pattern SPECIAL_PATTERN = Pattern.compile("[`~!@#$%^&*()+=|{}':;',\\[\\].<>/?！￥……（）——+|【】‘；：”“’。，、？]");

    // 匹配允许的名称格式的正则表达式，只允许中文、泰文、越南文、英文和数字
    private static final Pattern NAME_PATTERN = Pattern.compile("^[\u4e00-\u9fa5\u0e00-\u0e7f\uab00-\uab5f_a-zA-Z0-9]+$");

    // 禁用的关键词（防止敏感或系统保留名）
    private static final String[] RESERVED_KEYWORDS = {
            "admin", "gm", "root", "test", "null", "undefined", "fuck"
    };
    /**
     * 验证名称的长度是否在指定范围内。
     *
     * @param name  要验证的名称
     * @param minLen 最小长度
     * @param maxLen 最大长度
     * @return 如果名称长度在指定范围内返回 true，否则返回 false
     */
    public static boolean validateLength(String name, int minLen, int maxLen) {
        if (name == null) {
            return false;
        }
        int length = name.length();
        return length >= minLen && length <= maxLen;
    }

    /**
     * 验证名称是否符合要求。
     * 名称不能为空白，必须匹配允许的名称格式，不能包含 emoji 表情和特殊字符。
     *
     * @param name 要验证的名称
     * @return 如果名称符合要求返回 true，否则返回 false
     */
    public static boolean validName(String name) {
        if (StringUtils.isBlank(name)) {
            return false;
        }
        // 检查名称是否匹配允许的格式
        if (!NAME_PATTERN.matcher(name).matches()) {
            return false;
        }
        // 检查名称是否包含 emoji 表情
        if (EMOJI_PATTERN.matcher(name).find()) {
            return false;
        }
        // 检查名称是否包含特殊字符
        if (SPECIAL_PATTERN.matcher(name).find()) {
            return false;
        }
        // 禁止关键词
        for (String keyword : RESERVED_KEYWORDS) {
            if (name.equalsIgnoreCase(keyword)) {
                return false;
            }
        }
        return true;
    }

    public static void main(String[] args) {
        // ❌ 含特殊字符
        System.out.println(validName("bad$name")); // false

        // ❌ 含 emoji
        System.out.println(validName("小猫🐱")); // false

        // ❌ 含禁用关键字
        System.out.println(validName("admin")); // false
    }
}